'use strict';


const axios = require('axios');
const urlJoin = require('url-join');
const semver = require('semver');

// 获取信息
function getNpmInfo(npmName, registry) {
    if (!npmName) return null;
    const registryUrl = registry || getDefaultRegistry();
    const npmInfoUrl = urlJoin(registryUrl, npmName);
    return axios.get(npmInfoUrl).then(res => {
        if (res.status === 200) {
            return res.data;
        } else {
            return null;
        }
    }).catch(e => Promise.reject(e))
}

// 是否使用淘宝镜像
function getDefaultRegistry(isOriginal = false) {
    return isOriginal ? 'https://registry.npmjs.org' : 'https://registry.npm.taobao.org';
}

// 提取所有版本号
async function getNpmVersions(npmName, registry) {
    const data = await getNpmInfo(npmName, registry);
    if (data) {
        return Object.keys(data.versions);
    }
    return [];
}

// 比对那些版本号大于当前版本号
function getSemverVersions(baseVersion, versions) {
    return versions
    .filter(version => semver.satisfies(version, `^${baseVersion}`))
    .sort((a,b) => semver.gt(b, a));
}

// 获取最新版本号
async function getNpmSemverVersion(npmName, baseVersion, registry) {
    const versions = await getNpmVersions(npmName, registry);
    const newVersions = getSemverVersions(baseVersion, versions);
    if (newVersions && newVersions.length > 0) {
        return newVersions[0];
    }
}

// 获取npmbao最新的版本号
async function getNpmLatestVersion(npmName, registry) {
    const versions = await getNpmVersions(npmName, registry);
    if (versions) {
        return versions.sort((a, b) => semver.gt(b, a))[0];
    }
    return null;
}

module.exports = {
    getNpmSemverVersion,
    getDefaultRegistry,
    getNpmLatestVersion
};